package main

// 74. 搜索二维矩阵
func main() {
	//nums := [][]int{{1, 3, 5, 7}, {10, 11, 16, 20}, {23, 30, 34, 60}}
	//target := 7
	nums := [][]int{{1}}
	target := 1
	b := searchMatrix1(nums, target)
	println(b)
}

func searchMatrix1(matrix [][]int, target int) bool {
	// 先横向找到x轴坐标，找到 num[i] <= target < num[i+1]
	// 再纵向找，如果找不到，返回false
	if len(matrix) == 0 || len(matrix[0]) == 0 {
		return false
	}

	// 此时left == right，目标x轴已获取
	top, bottom := 0, len(matrix)-1
	for top < bottom {
		mid := (bottom-top)/2 + top
		midNum := matrix[mid][0]
		if midNum >= target {
			bottom = mid
		} else {
			top = mid + 1
		}
	}

	// 纵向遍历，一定会定位在 >= target的位置，但我们需要的是< target的位置继续向下遍历，所以需要增加判断
	if top != 0 && matrix[top][0] > target {
		top = top - 1
	}

	currLine := matrix[top]
	left, right := 0, len(currLine)-1
	for left < right {
		mid := (right-left)/2 + left
		midNum := currLine[mid]
		if target <= midNum {
			right = mid
		} else {
			left = mid + 1
		}
	}

	if matrix[top][left] == target {
		return true
	}

	return false
}

func searchMatrix(matrix [][]int, target int) bool { // 错误思路
	// 先横向找到x轴坐标，找到 num[i] <= target < num[i+1]
	// 再纵向找，如果找不到，返回false
	if len(matrix) == 0 || len(matrix[0]) == 0 {
		return false
	}

	firstLine := matrix[0]
	left, right := 0, len(firstLine)-1
	for left < right {
		mid := (right-left)/2 + left
		midNum := firstLine[mid]
		if target <= midNum {
			right = mid
		} else {
			left = mid + 1
		}
	}

	// 此时left == right，目标x轴已获取
	top, bottom := 0, len(matrix)-1
	for top < bottom {
		mid := (bottom-top)/2 + top
		midNum := matrix[mid][left]
		if midNum >= target {
			bottom = mid
		} else {
			top = mid + 1
		}
	}

	if matrix[top][left] == target {
		return true
	}

	return false
}

// 给你一个满足下述两条属性的 m x n 整数矩阵：
//
//每行中的整数从左到右按非严格递增顺序排列。
//每行的第一个整数大于前一行的最后一个整数。
//给你一个整数 target ，如果 target 在矩阵中，返回 true ；否则，返回 false 。
//
//
//
//示例 1：
//
//
//输入：matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
//输出：true
//示例 2：
//
//
//输入：matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
//输出：false
//
//
//提示：
//
//m == matrix.length
//n == matrix[i].length
//1 <= m, n <= 100
//-104 <= matrix[i][j], target <= 104
